/**
 * \class IExp IExp.h <AbsSyn/IExp.h>
 *
 * \brief Interface For expressions
 *
 * All expressions needs to inherit from the IExp interface
 * This will force all objects to include ICloneable and IExpVisitable
 *
 *
 *  Created on: 31 mar 2011
 *      @author: calle
 *
 *
 *  \ingroup Interfaces
 *  \defgroup Expressions Expression Classes
 */

#ifndef IEXP_H_
#define IEXP_H_




#include <Interfaces/IExpVisitable.h>
#include <Interfaces/ICloneable.h>
#include <Interfaces/IPrintable.h>
#include <map>
#include <string>
#include <Generator/TerminalState.h>
#include <boost/shared_ptr.hpp>
#include <AbsSyn/AbsSyn.h>


using namespace std;

class IExpVisitor;

class IExp : public IExpVisitable,public ICloneable,public IPrintable {
public:


	virtual ~IExp();

	IExp();


	virtual void accept(IExpVisitor *v)=0;

	/**{};
	 * \addtogroup Cloneable
	 * @{
	 *
	 * \brief cloneable expression
	 *
	 * Abstraction for cloneable.
	 * @return Expression interface.
	 */
	virtual IExp* clone() const =0;
	/*!@}*/

	virtual std::string toString()const=0;

protected:


private:



};



#endif /* IEXP_H_ */
